package twentyThreePattern.BehaviorPattern11.visitor.dispatch;

/**
 * 变量被声明时的类型叫做变量的静态类型(Static Type) 又叫明显类型(Apparent
 * Type)。变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。
 * 根据对象的类型而对方法进行的选择,就是分派(Dispatch)。根据分派发生的时期，可以将分派分为两种，即分派分静态分派和动态分派。
 * 静态分派(Static Dispatch) 发生在编译时期，分派根据静态类型信息发生。方法重载(Overload)就是静态分派。（所谓的：编译时多态）
 * 动态分派(Dynamic Dispatch)
 * 发生在运行时期，动态分派动态地置换掉某个方法。面向对象的语言利用动态分派来实现方法置换产生的多态性。（所谓的：运行时多态）
 * 
 * 方法重载（静态分派）：重载方法的分派是根据静态类型进行的。这个分派过程在编译时期就完成了。
 * 动态分派：问题的核心是Java编译器在编译时期并不总是知道哪一些代码会被执行，因为编译器仅仅知道对象的静态类型，
 * 而不知道对象的真实类型，而方法的调用则是根据真实类型(o的真实类型为String)，而不是静态类型。
 * 
 * 
 * 双重分派 一个方法根据两个宗量的类型来决定执行不同的代码，这就是“双分派”或者“多重分派”。Java不支持动态的多分派。但可以通过使用设计模式，
 * 在Java语言里面实现动态的双重分派（ps：就是“伪双重分派”是由两次的单分派组成）。
 * 方案一：类型判断
 * 方案二：反转球
 */
public class Client {

	public static void main(String[] args) {
		// 定义一个演员
		AbsActor actor = new OldActor();
		// 定义一个角色
		Role role = new KungFuRole();
		// 开始演戏
		actor.act(role);
		actor.act(new KungFuRole());
	}
}
